【翻訳】Don’t Use Facadesに対する回答
This afternoon an article was posted to Reddit that cautioned users of Laravel to stop using “Facades”.
今日の午後、RedditにLaravelのユーザーに「Facades」の使用を中止するよう警告する記事が投稿されてました。
In the context of Laravel, Facades are what you are using when you make what appears to be a static call to a class. For example:
Laraveにおけるファサードはクラスへの静的呼び出しのように見えるものを作成するときに使用しているものです。
例えば
code:php
Route::get('/', 'HomeController@showWelcome');
However, as many of you are already aware, this call may be rewritten like so:
しかし、多くの方が既に知っているようにこの呼び出し以下のように書き直す事もできます
code:php
app'router'->get('/', 'HomeController@showWelcome'); The code may be written easier way because, at their core, facades are syntactic sugar for service location. When you make a call to a Facade, the Facade resolves the underlying class out of the Laravel IoC container and calls the intended method on the instance. They provide a very terse, expressive syntax, while still maintaining the ability to test your code.
ファサードは、サービスの場所を表すための糖衣構文(syntactic suga)であるため簡単にどこからでも呼び出す事ができます。ファサードを呼び出すと、ファサードはLaravelのIoCコンテナー(サービスコンテナ)から基礎となるクラス解決し、インスタンス上で目的のメソッドを呼び出します。 テストコードが書きやすい機能を提供しつつ、非常に簡潔で表現力のある機能を提供します。
However, service location can lead developers into some bad architectural habits. For instance, since service location is very “easy”, it can lead to responsibility bloat in your classes. Generally, classes with small, focused responsibilities are to be desired since they are easier to understand, test, debug, etc. However, if you are using Facades to push to the queue, send an e-mail, and validate some data all within a single class, that class’ core responsibilities are obscured. It is concerned about way too many things.
しかしながらサービの開発においてこれは悪い設計に導く時があります。
たとえば、このファサードを追加するのは「簡単」なので、クラスで責任が増大する可能性があります。 一般的にクラスを作る際は、理解のしやすや、テスト、デバックなどを優先する為、責任を集中し小さくなるように作る事が望まれます。
ただし、Facadesを使用してキューにプッシュし、電子メールを送信し、すべてのデータを検証すると言った責務を単一のクラスに詰め込むと、そのクラスの中心的な責任は不明瞭です。 それはやりすぎだと心配しています。
It is possible to use Facades responsibly and keep your class responsibilities narrowly focused. However, some prefer the discipline that constructor injection provides. Constructor injection means that a class’ dependencies are injected via the constructor when that class is created. It is an explicit declaration of what that class needs, and therefore gives an idea as to what that class does.
ファサードを責任を持って使えればあなたのクラスの責任を狭く集中させることは可能です。 ただし、一部の人は constructor injection で提供する分野を好みます。 constructor injectionとは、クラスが作成されたときにクラスの依存関係がコンストラクタを介して依存性が注入されることを意味します。
それはそのクラスが何を必要としているかの明示的な宣言であり、そしてそれ故そのクラスが何をするかについての考えを与えます。
Before today, injecting the underlying class behind a facade required some explicit bindings to be registered in the IoC container; however, starting today, it is now just as easy to inject your dependencies as it is to use a Facade. By simply type-hinting the class underlying the Facade, it will automatically be injected by the container when it is needed as a dependency.
今日(こんにち)より前は、ファサードの背後にある基底クラスを注入するには、明示的なバインディングをIoCコンテナに登録する必要がありました。 しかし、今ではファサードを使用するのと同じくらい簡単に依存関係を注入することができます。 Facadeの基礎となるクラスを単にタイプヒントするだけで、依存関係として必要になったときにコンテナによって自動的に挿入されます。
For example, need an instance of the Session injected into a controller? Just do this:
たとえば、セッションのインスタンスをコントローラに注入する必要がありますか? これを実行してください。
code:php
<?php
class HomeController extends BaseController {
public function __construct(Illuminate\Session\Store $session)
{
$this->session = $session;
}
}
There is no longer any need to do any extra configuration. Since all controllers are automatically resolved by the Laravel IoC container, the session instance will automatically be injected. Injecting the class underlying the Facade is just as easy as using the Facade itself! If you love using Facades, keep on using them, just keep an eye on those class responsibilities! If you prefer constructor injection, it just got a heck of a lot easier!
追加の設定を行う必要はもうありません。 すべてのコントローラはLaravelのIoCコンテナ(DIコンテナ)によって自動的に解決されるため、セッションインスタンスは自動的に挿入されます。 ファサードの基礎となるクラスへの注入は、ファサード自体を使用するのと同じくらい簡単です。 あなたがファサードを使うのが好きなら、それらを使い続け、それらのクラスの責任に注目してください! あなたがconstructor injectionを好めば、簡単に実現する事が可能です!
If you’re not sure what class to type-hint, check out the Facade To Class Reference from the Laravel documentation.
Enjoy!
では!